home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / cross / ava-0.2.5.lha / ava-0.2.5 / src / Error.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-03-23  |  3.2 KB  |  129 lines

  1. /* Error.h */
  2.  
  3. #ifndef __ERROR
  4. #define __ERROR
  5.  
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include "Lexer.h"
  9. #include "Preproc.h"
  10.  
  11. /* global structure */
  12. extern TlxData lxdata;
  13.  
  14. /* Global Error Class - Abstract Type */
  15. class global_error{
  16. public:
  17.   virtual void print(FILE* fd=stderr) = 0;
  18.   virtual ~global_error(){}
  19.   global_error(){}
  20. };
  21.  
  22. /* Generic Error Class */
  23. class generic_error: public global_error{
  24. public:
  25.   generic_error(const char* msg){errmsg = msg;}
  26.   ~generic_error(){}
  27.   void print(FILE* fd=stderr){fprintf (fd, "%s\n", errmsg);}
  28. private:
  29.   const char* errmsg;
  30. };
  31.  
  32. /* File Error Class */
  33. class file_error: public global_error{
  34. public:
  35.   file_error (const char *msg){strcpy(errmsg, msg);}
  36.   void print (FILE* fd=stderr){ 
  37.     fprintf(fd, "%s: ",errmsg); perror("");}
  38.   ~file_error (){}
  39. private:
  40.   char errmsg [LX_LINEBUF];
  41. };
  42.  
  43. /* Lexer Error Class */
  44. class lexer_error: public global_error{
  45. public:
  46.   lexer_error (char _invalid_ch) { invalid_ch = _invalid_ch; mode = 1; }
  47.   lexer_error (const char *_errmsg) { errmsg = _errmsg; mode = 2; }
  48.   void print (FILE* fd=stderr) {
  49.     switch (mode) {
  50.     case 1:
  51.       fprintf (fd, "%s:%ld: Invalid character %c in column %ld.\n", 
  52.            preproc.name(), preproc.lxline(), invalid_ch, preproc.lxcur());
  53.       break;
  54.     case 2:
  55.       fprintf (fd, "%s:%ld: %s in column %ld.\n",
  56.            preproc.name(), preproc.lxline(), errmsg, preproc.lxcur());
  57.       break;
  58.     }
  59.   }
  60.   ~lexer_error () {}
  61. private:
  62.   int mode;
  63.   char invalid_ch;
  64.   const char *errmsg;
  65. };
  66.  
  67. /* Syntax Errors */
  68. class syntax_error: public global_error {
  69. public:
  70.   syntax_error (const char* _errmsg): errmsg(_errmsg),op(NULL),arg(-1) {}
  71.   syntax_error (const char* _errmsg, const char* _op): 
  72.     errmsg(_errmsg),op(_op),arg(-1) {}
  73.   syntax_error (int _arg, const char* _errmsg, const char* _op): 
  74.     errmsg(_errmsg),op(_op),arg(_arg) {}
  75.     
  76.   void print (FILE* fd=stderr) {
  77.     if (op==NULL) {
  78.       fprintf (fd, "%s:%ld: %s\n",
  79.                preproc.name(), preproc.line(), errmsg);
  80.     } else {
  81.       if (arg<0) {
  82.         fprintf (fd, "%s:%ld: %s%s\n", preproc.name(), 
  83.                  preproc.line(), errmsg, op);
  84.       } else {
  85.         fprintf (fd, "%s:%ld: arg(%d): %s'%s'\n", preproc.name(),
  86.              preproc.line(), arg+1, errmsg, op);
  87.       }
  88.     }
  89.   }    
  90.   ~syntax_error () {} 
  91. private:
  92.   const char* errmsg;
  93.   const char* op;
  94.   int arg;
  95. };
  96.  
  97. /* Segment Errors */
  98. class segment_error: public global_error {
  99. public:
  100.   segment_error (const char* _errmsg): errmsg(_errmsg),op(NULL),arg(-1) {}
  101.   segment_error (const char* _errmsg, const char* _op): 
  102.     errmsg(_errmsg),op(_op),arg(-1) {}
  103.   segment_error (int _arg, const char* _errmsg, char* _op): 
  104.     errmsg(_errmsg),op(_op),arg(_arg) {}
  105.     
  106.   void print (FILE* fd=stderr) {
  107.     if (op==NULL) {
  108.       fprintf (fd, "%s:%ld: %s\n",
  109.                preproc.name(), preproc.line(), errmsg);
  110.     } else {
  111.       if (arg<0) {
  112.         fprintf (fd, "%s:%ld: %s%s\n", preproc.name(), 
  113.                  preproc.line(), errmsg, op);
  114.       } else {
  115.         fprintf (fd, "%s:%ld: arg(%d): %s'%s'\n", preproc.name(),
  116.              preproc.line(), arg+1, errmsg, op);
  117.       }
  118.     }
  119.   }
  120.   ~segment_error () {} 
  121. private:
  122.   const char* errmsg;
  123.   const char* op;
  124.   int arg;
  125. };
  126.  
  127.  
  128. #endif
  129.